﻿CREATE procedure [dbo].[spGuardaPaciente](
	@pnIdLaboratorio	INT,
	@pnIdPaciente		INT output,
	@pnIdTitulo			INT,
	@psNombre			VARCHAR(300),
	@psApellidoPaterno	VARCHAR(300),
	@psApellidoMaterno	VARCHAR(300),
	@pnEdad				INT,
	@pnIdTiempo			INT,
	@pnIdSexo			INT,
	@ptfur				DATE,
	@pnIdEstado			INT,
	@pnIdMunicipio		INT,
	@pnCodigoPostal		BIGINT,
	@pnIdColonia		INT,
	@psCalle			VARCHAR(400),
	@psNumeroExt		VARCHAR(40),
	@psNumeroInt		VARCHAR(40),
	@psTelefono			VARCHAR(40),
	@pnIdProcedencia	INT,
	@psIpMod			VARCHAR(15),
	@pnIdUsuarioMod		INT,
	@pnIdSucursal		INT,
	@pnIdDoctor			INT,
	@psEstudios			VARCHAR(MAX))
as
BEGIN
	SET NOCOUNT ON;
	
	SET @pnIdTitulo = NULLIF(@pnIdTitulo,-1)
	SET @pnIdTiempo = nullif(@pnIdTiempo,-1)
	SET @pnIdSexo = NULLIF(@pnIdSexo,-1)
	SET @pnIdTitulo = NULLIF(@pnIdTitulo,0)
	SET @pnIdTiempo = nullif(@pnIdTiempo,0)
	SET @pnIdSexo = NULLIF(@pnIdSexo,0)
	SET @pnIdProcedencia = NULLIF(@pnIdProcedencia, 0)
	SET @pnIdDoctor = NULLIF(@pnIdProcedencia, 0)
	SET @pnIdProcedencia = NULLIF(@pnIdProcedencia, -1)
	SET @pnIdDoctor = NULLIF(@pnIdProcedencia, -1)
	SET @psNumeroInt = NULLIF(@psNumeroInt,'')
	
	DECLARE @nIdXml		INT,
			@nIdRecibo	INT,
			@nImporte	DECIMAL(22,2),
			@nIVA		DECIMAL(22,2),
			@nCfgIva	INT,
			@nIvaDefault DECIMAL(2,2)
	DECLARE @tblRegistros TABLE (Indice INT IDENTITY(1,1), IdEstudio INT, EsCortesia TINYINT, EsPaquete TINYINT)
	SELECT @nCfgIva = CONVERT(INT, Valor1) FROM CfgConfiguracion WHERE IdConfiguracion = 1
	
	IF ISNULL(@pnIdPaciente,0) > 0
	BEGIN
		UPDATE dbo.CatPaciente
		SET		IdTitulo	= @pnIdTitulo,
				Nombre		= @psNombre,
				ApellidoPaterno = @psApellidoPaterno,
				ApellidoMaterno = @psApellidoMaterno,
				Edad		= @pnEdad,
				IdTiempo	= @pnIdTiempo,
				IdSexo		= @pnIdSexo,
				fur			= @ptfur,
				IdEstado	= @pnIdEstado,
				IdMunicipio	= @pnIdMunicipio,
				CodigoPostal= @pnCodigoPostal,
				IdColonia	= @pnIdColonia,
				Calle		= @psCalle,
				NumeroExt	= @psNumeroExt,
				NumeroInt	= @psNumeroInt,
				Telefono	= @psTelefono,
				IdProcedencia= @pnIdProcedencia,
			    FechaMod	= GETDATE(),
				IpMod		= @psIpMod,
			    IdUsuarioMod= @pnIdUsuarioMod,
				IdDoctor	= @pnIdDoctor
		WHERE	IdSucursal	= @pnIdSucursal
		AND		IdLaboratorio= @pnIdLaboratorio
		AND		IdPaciente	= @pnIdPaciente
	END
	ELSE
	BEGIN
		SELECT @pnIdPaciente = ISNULL(MAX(IdPaciente),0) + 1 FROM	CatPaciente
		INSERT INTO CatPaciente(
					IdPaciente,
					IdLaboratorio,
					IdTitulo,
					Nombre,
					ApellidoPaterno,
					ApellidoMaterno,
					Edad,
					IdTiempo,
					IdSexo,
					fur,
					IdEstado,
					IdMunicipio,
					CodigoPostal,
					IdColonia,
					Calle,
					NumeroExt,
					NumeroInt,
					Telefono,
					IdProcedencia,
					FechaMod,
					IpMod,
					IdUsuarioMod,
					IdSucursal,
					IdDoctor,
					EsActivo)
			VALUES(
					ISNULL(@pnIdPaciente,1),
					@pnIdLaboratorio,
					@pnIdTitulo,
					@psNombre,
					@psApellidoPaterno,
					@psApellidoMaterno,
					@pnEdad,
					@pnIdTiempo,
					@pnIdSexo,
					@ptfur,
					@pnIdEstado,
					@pnIdMunicipio,
					@pnCodigoPostal,
					@pnIdColonia,
					@psCalle,
					@psNumeroExt,
					@psNumeroInt,
					@psTelefono,
					@pnIdProcedencia,
					GETDATE(),
					@psIpMod,
					@pnIdUsuarioMod,
					@pnIdSucursal,
					@pnIdDoctor,
					1
			)
			
			DECLARE @nIdUsuario INT,
					@sUserName VARCHAR(20)
			SELECT @sUserName = 'Paciente' + CONVERT(VARCHAR(30), @pnIdLaboratorio) + RIGHT('000000' + CONVERT(VARCHAR(10),@pnIdPaciente),6)
			EXEC spInsertaUsuario @nIdUsuario OUT, @pnIdLaboratorio, @sUserName, @pnIdSucursal
		
			INSERT INTO dbo.RelUsuarioPaciente
			        ( IdUsuario ,
			          IdPaciente ,
			          IdLaboratorio ,
			          IdSucursal
			        )
			VALUES  ( @nIdUsuario , -- IdUsuario - int
			          ISNULL(@pnIdPaciente,1) , -- IdPaciente - int
			          @pnIdLaboratorio , -- IdLaboratorio - int
			          @pnIdSucursal  -- IdSucursal - int
			        )
	END
	
	IF ISNULL(@psEstudios,'') <> ''
	BEGIN 
		exec dbo.sp_xml_preparedocument @nIdXml OUTPUT, @psEstudios

		INSERT INTO @tblRegistros (IdEstudio, EsCortesia, EsPaquete)
		SELECT IdEstudio, EsCortesia, EsPaquete
		FROM OPENXML (@nIdXml, '/tabla/renglon', 3)
		WITH (IdEstudio INT, EsCortesia TINYINT, EsPaquete TINYINT)

		EXEC dbo.sp_xml_removedocument @nIdXml
	END

	--SELECT * FROM @tblRegistros
	
	SELECT @nIdRecibo = ISNULL(MAX(IdRecibo),0) + 1 FROM Recibo WHERE IdLaboratorio = @pnIdLaboratorio AND IdSucursal = @pnIdSucursal
	
	SELECT	r.IdEstudio,
			CASE WHEN r.EsPaquete = 0 THEN e.Precio WHEN r.EsPaquete = 1 THEN p.Precio ELSE 0 END AS Precio,
			r.EsCortesia,
			r.EsPaquete
	INTO	#tmpDetalle
	FROM	@tblRegistros		r
	LEFT JOIN CatEstudio			e (NOLOCK)
	ON		e.IdEstudio		= r.IdEstudio
	AND		e.IdLaboratorio	= @pnIdLaboratorio
	AND		r.EsPaquete		= 0
	LEFT JOIN dbo.PaqueteEstudio	p (NOLOCK)
	ON		r.IdEstudio		= p.IdPaquete
	AND		p.IdLaboratorio	= @pnIdLaboratorio
	AND		r.EsPaquete		= 1
	
	SELECT	@nImporte	= SUM(Precio) FROM #tmpDetalle WHERE EsCortesia = 0
	SELECT	@nIVA		= @nImporte * Valor FROM CatIva where IdIva = @nCfgIva
	SELECT	@nIvaDefault= Valor FROM CatIva where IdIva = @nCfgIva
	
	INSERT INTO Recibo (
				IdRecibo,
				IdLaboratorio,
				FechaRegistro,
				IdPaciente,
				Importe,
				ImporteIva,
				IdEstatus,
				FechaMod,
				IpMod,
				IdUsuarioMod,
				IdSucursal)
	VALUES(
				ISNULL(@nIdRecibo, 1),
				@pnIdLaboratorio,
				GETDATE(),
				@pnIdPaciente,
				@nImporte - @nIVA,
				@nIVA,
				2, -- Pagado
				GETDATE(),
				@psIpMod,
				@pnIdUsuarioMod,
				@pnIdSucursal
		  )
		  
	INSERT INTO ReciboDet(
				IdRecibo,
				IdLaboratorio,
				IdReciboDet,
				IdEstudio,
				EsCortesia,
				Importe,
				ImporteIva,
				FechaMod,
				IpMod,
				IdUsuarioMod,
				IdSucursal,
				EsPaquete
		)
	SELECT		@nIdRecibo,
				@pnIdLaboratorio,
				ROW_NUMBER() OVER(ORDER BY IdEstudio),
				IdEstudio,
				EsCortesia,
				CASE WHEN EsCortesia = 1 THEN 0 ELSE Precio - (Precio * @nIvaDefault) END,
				CASE WHEN EsCortesia = 1 THEN 0 ELSE Precio * @nIvaDefault END,
				GETDATE(),
				@psIpMod,
				@pnIdUsuarioMod,
				@pnIdSucursal,
				EsPaquete
	FROM		#tmpDetalle
	
	SELECT		@pnIdPaciente as IdPaciente, @nIdRecibo as IdRecibo
	
	SET NOCOUNT OFF;
END